package com.atguigu.LinkedList;

public class DoubleLinkedListDemo {
    public static void main(String[] args) {
        System.out.println("双向链表的测试");
        HeroNode2 heroNode = new HeroNode2(5, "55", "555");
        HeroNode2 heroNode1 = new HeroNode2(1, "11", "111");
        HeroNode2 heroNode2 = new HeroNode2(3, "33", "333");
        HeroNode2 heroNode3 = new HeroNode2(4, "44", "444");
        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
        doubleLinkedList.addById(heroNode);
        doubleLinkedList.addById(heroNode1);
        doubleLinkedList.addById(heroNode2);
        doubleLinkedList.addById(heroNode3);
//        doubleLinkedList.add(heroNode);
//        doubleLinkedList.add(heroNode1);
//        doubleLinkedList.add(heroNode2);
//        doubleLinkedList.add(heroNode3);
        doubleLinkedList.list();
//        doubleLinkedList.updata(new HeroNode2(1,"22","222"));
//        System.out.println("修改之后");
//        doubleLinkedList.list();
//        System.out.println("删除之后");
//        doubleLinkedList.del(1);
//        doubleLinkedList.list();

    }
}

class DoubleLinkedList{
    //初始化一个头节点，不放置具体数
    private HeroNode2 root=new HeroNode2(0,"","");


    //根据编号的顺序添加英雄
    public void addById(HeroNode2 heroNode){

        //我们的temp是位于添加位置的前一个节点
        HeroNode2 temp=root;
        boolean flag=false;
        while (true){
            //我们我们的temp已经指向了最后一个节点
            if(temp.next==null){
                break;
            }
            //遍历的时候，更具他们的no值进行比较，
            if(temp.next.no>heroNode.no){//位置找到了，就在temp的后买你
                break;
            }else if(temp.no==heroNode.no){
                flag=true;
                break;
            }else {//位置没有找到，继续向后走
                temp = temp.next;
            }
        }
        //根据flag判断
        if(flag){
            System.out.printf("%d已经存在了",heroNode.no);
        }else{
                //判断是否达到最后一个节点
               if(temp.next!=null){
                   heroNode.next=temp.next;
                   temp.next.pre=heroNode;
               }
               //将heroNode与前面的节点相连
               temp.next=heroNode;
               heroNode.pre=temp;




        }
    }

    //当不考虑编号的顺序问题时，找到当前链表的最后节点，将最后节点的next指向新的节点
    public void add(HeroNode2 hereNode){
        //因为head节点不能动，我们需要一个辅助节点来帮助我们
        HeroNode2 temp=root;
        while (true){
            //为空，则代表找到了最后一个节点
            if(temp.next==null){
                break;
            }
            //否则，找到下一个节点
            temp=temp.next;
        }
        //当退出循环的时候，temp指向最后一个节点，完成添加
        temp.next=hereNode;
        hereNode.pre=temp;
    }
    //删除一个节点
    /*
    * 对于双向链表我们可以直接找到这个要删除的节点
    * 找到后删除
    * */
    public void del(int no){
        //判断链表是否为空
        if(root.next==null){
            System.out.println("链表为空");
            return;
        }
        //因为时头节点，不能动，我们使用一个辅助节点来遍历
        HeroNode2 temp=root;
//        设置一个标记位，判断我们是否找到了要删除的节点
        boolean flag=false;
        while (true){
            //表示已经到了链表的末尾
            if(temp.next==null){
                break;
            }
            if(temp.no==no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if(flag){
            //表示已经找到了该节点
            //如果是最后一个节点，不需要这一句话，否则会出现空指针异常
            if(temp.next!=null){
                temp.next.pre=temp.pre;
            }
            temp.pre.next=temp.next;
        }else{
            System.out.printf("没有找到序号为%d的节点",no);
        }

    }

    //修改一个节点
    public void updata(HeroNode2 newHeroNode){
        //判断链表是否为空
        if(root.next==null){
            System.out.println("链表为空");
            return;
        }
        //用一个临时变量来作为指针
        HeroNode2 temp=root.next;
        //设置一个变量，表示是否找到该节点
        boolean flag=false;
        while (true){
            if(temp==null){
                break;//链表遍历结束
            }
            if(temp.no==newHeroNode.no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        //根据flag 判断是否找到要修改的节点
        if(flag){//表示已经找到了
            temp.nickname=newHeroNode.nickname;
            temp.name=newHeroNode.name;
        }else{
            System.out.printf("没有找到序号为%d的节点",newHeroNode.no);
        }
    }

    //遍历节点
    public void list(){
        //判断链表是否为空
        if(root.next==null){
            System.out.println("链表为空");
            return;
        }
        //因为时头节点，不能动，我们使用一个辅助节点来遍历
        HeroNode2 temp=root.next;
        while (true){

            //判断是否到了最后一个节点
            if(temp==null){
                break;
            }
            System.out.println(temp.toString());
//            将temp后移动
            temp=temp.next;
        }
    }

}


class HeroNode2{
    public int no;
    public String name;
    public String nickname;
    public HeroNode2 pre;//默认为null
    public HeroNode2 next;//默认为null
    public HeroNode2(  int no, String name,String nickname){
        this.no=no;
        this.name=name;
        this.nickname=nickname;
    }

    @Override
    public String toString() {
        return "HeroNode2{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}
